package com.qdlc.p2p.biz.service;

import java.util.List;

import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.BorrowTender;
import com.qdlc.p2p.dal.dto.User;
import com.qdlc.p2p.dal.dto.UserWineCoupons;
import com.qdlc.p2p.dal.model.UserWineCouponsModel;

/**
 * 用户酒券获取记录Service接口
 *
 * @author ygw
 * @version 1.1.0.0
 * @date 2016年5月6日 下午3:45:39
 */
public interface UserWineCouponsService {
    /**
     * 保存用户酒券
     *
     * @param userWineCoupons
     * @return UserWineCoupons
     */
    UserWineCoupons save(UserWineCoupons userWineCoupons);

    /**
     * 分页查询用户酒券记录
     *
     * @param model UserWineCouponsModel
     * @return PageDataList<UserWineCouponsModel>
     */
    PageDataList<UserWineCouponsModel> list(UserWineCouponsModel model);

    /**
     * 发放酒券
     *
     * @param toUserId      酒券获取用户ID
     * @param wineCouponsId 酒券方案ID
     * @param sourceType    酒券来源
     * @return UserWineCoupons
     */
    UserWineCoupons giveWineCoupons(long toUserId, long wineCouponsId, String sourceType);

    /**
     * 修改用户酒券
     *
     * @param userWineCoupons 用户酒券
     * @return UserWineCoupons
     */
    UserWineCoupons update(UserWineCoupons userWineCoupons);

    /**
     * 把用户酒券置为无效
     *
     * @param id 用户酒券主键ID
     */
    void doInvalid(long id);

    /**
     * 根据用户ID获取可使用酒券列表
     *
     * @param userId 查询用户ID
     * @return List<UserWineCoupons>
     */
    List<UserWineCouponsModel> useableList(long userId);

    /**
     * 根据用户ID获取可使用酒券个数
     *
     * @param userId
     * @return 酒券个数
     */
    int userableCount(long userId);

    /**
     * 根据ID获取选择使用酒券的值
     *
     * @param ids    酒券ID集合
     * @param toUserId 用户
     * @return 酒券总额
     */
    double getTotalAmountByIds(long[] ids, long toUserId);

    /**
     * 根据用户和投标ID获取投标使用酒券金额
     *
     * @param tenderId
     * @return 酒券金额
     */
    double getTenderUseAmount(long tenderId);

    /**
     * 投资借款标冻结酒券
     *
     * @param borrowTender   投标对象
     * @param wineCouponsIds 酒券id集合
     */
    void tenderBorrowFreezeWineCoupons(BorrowTender borrowTender, long[] wineCouponsIds);

    /**
     * 投资借款标使用酒券
     *
     * @param tenderId 投标id
     */
    void tenderBorrowUseWineCoupons(long tenderId);

    /**
     * 投资借款标失败酒券还原
     *
     * @param borrowTender 投标对象
     */
    void tenderBorrowFailUseWineCoupons(BorrowTender borrowTender);

    /**
     * 根据使用类型和外键ID获取酒券总额
     *
     * @param useType 使用类型
     * @param keyId   外键ID
     * @return
     */
    double getTotalAmountByUseTypeANdKeyId(String useType, long keyId);

    /**
     * 检测用户使用的酒券状态
     *
     * @param wineCouponsIds
     * @param user
     * @return
     */
    boolean checkWineCoupons(long[] wineCouponsIds, User user);

    /**
     * 根据状态查询对应 酒券总额
     *
     * @param status
     * @return
     */
    double[] getUseWineCouponsSumByStatus(int status, String date);

    /**
     * 酒券过期处理
     */
    void wineCouponsExpireDispose();

    /**
     * 更新状态
     */
	void updateStatus(long id, byte status, byte preStatus);
}
